package com.lanou3g.code0417.tickets;

import com.lanou3g.code0417.rhread1.ThreadA;

/**
 * Created by dllo on 18/4/17.
 */
//票务中心
public class TicketOffice {
    private int tickets = 100;//有100张票
    private final Object lock = new Object();

    //返回值代表是否还有票
    public boolean sellTicket() {
        /**
         * 为了解决线程安全问题,java引入了同步机制:synchronized
         * 语法:
         *synchronized(lock){
         * 只能一时间有一个线程访问
         * }
         * 大括号内的代码,在同一时间,只能被一个线程调用
         * 即使线程在括号内停止了,其他线程也无法进入到大括号内
         * 小括号内我们称之为锁对象,可以使任意的对象
         * 但是要注意,成为锁对象的对象,不能再改变了
         * 一般的,我们都会为锁对象,加上final,防止他被改变
         */
        synchronized (lock) {
            if (tickets <= 0) {
                return false;
            }
            try {
                //让当前线程停止100毫秒
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tickets--;
            System.out.println(Thread.currentThread().getName() + "卖出一张票,还剩" + tickets + "张");
            return true;
        }
    }
    //在方法的返回值前,可以加上synchronized,相当于把整个方法都放在同步代码块中
    //不需要写锁对象,这时,锁对象是类名.class(这个类的类对象JVM加载这个类时,自动创建的)
    public synchronized void fun(){

    }
}
